package thinkingInJava.enumerated;
// page 594 对反射比编译器为我们做了什么
//: enumerated/Reflection.java
//Analyzing enums using reflection.
import java.lang.reflect.*;
import java.util.*;
import thinkingInJava.io.OSExecute;

import static thinkingInJava.YTool.YPrint.*;

enum Explore { HERE, THERE }

public class Reflection {
	public static Set<String> analyze(Class<?> enumClass) {
		print("----- Analyzing " + enumClass + " -----");
		print("Interfaces:");
		for(Type t : enumClass.getGenericInterfaces())
			print(t);
		print("Base: " + enumClass.getSuperclass());
		print("Methods: ");
		Set<String> methods = new TreeSet<String>();
		for(Method m : enumClass.getMethods())
			methods.add(m.getName());
		print(methods);
		return methods;
	}
	public static void main(String[] args) {
		Set<String> exploreMethods = analyze(Explore.class);
		Set<String> enumMethods = analyze(Enum.class);
		print("Explore.containsAll(Enum)? " +
				exploreMethods.containsAll(enumMethods));
		printnb("Explore.removeAll(Enum): ");
		exploreMethods.removeAll(enumMethods);
		print(exploreMethods);
		// Decompile the code for the enum: 反编译
		OSExecute.command("javap Explore");
	}
} /* Output:
----- Analyzing class Explore -----
Interfaces:
Base: class java.lang.Enum
Methods:
[compareTo, equals, getClass, getDeclaringClass, hashCode, name, notify, notifyAll, ordinal, toString, valueOf, values, wait]
----- Analyzing class java.lang.Enum -----
Interfaces:
java.lang.Comparable<E>
interface java.io.Serializable
Base: class java.lang.Object
Methods:
[compareTo, equals, getClass, getDeclaringClass, hashCode, name, notify, notifyAll, ordinal, toString, valueOf, wait]
Explore.containsAll(Enum)? true
Explore.removeAll(Enum): [values]
Compiled from "Reflection.java"
final class Explore extends java.lang.Enum{
 public static final Explore HERE;
 public static final Explore THERE;
 public static final Explore[] values();
 public static Explore valueOf(java.lang.String);
 static {};
}
 *///:~
